//import com.google.common.collect.Maps;
//import com.google.common.collect.Sets;
//import com.sankuai.inf.leaf.common.Result;
//import com.sankuai.inf.leaf.common.Status;
//import org.joda.time.DateTime;
//import org.springframework.util.StopWatch;
//
//import java.util.Date;
//import java.util.Map;
//import java.util.Random;
//import java.util.Set;
//
//public class Test {
//    private long lastTimestamp = -1L;
//    private long sequence = 0L;
//    private static final Random RANDOM = new Random();
//    private long workerId = 1;
//
//
//    public static void main(String[] args) {
//        System.out.println(100000000000000000L >> 22);
//        System.out.println(100000000000L >> 22);
//        System.out.println(10240003145727L >> 22);
//        System.out.println(23841857910L << 22 | 1023L << 12 | 4095L);//18位
//        System.out.println(20000L << 22 | 999L << 12 | 4000L);//11位
//
//
//        System.out.println(10000L << 22 | 0L << 12 | 1L);//最少11位 41943040001
//        System.out.println(10000L << 22 | 1023L << 12 | 4095L);//最少11位 41947234303
//        System.out.println(41943040001L >> 22);
//        System.out.println(41947234303L >> 22);
//
//        System.out.println(83886553887L >> 22);
//        System.out.println(2566697952830943253L >> 22);
//        System.out.println(2566718966290478789L >> 22);
//        System.out.println(611948478896L - 611953488896L);
//        System.out.println(Long.MAX_VALUE / 10000L / 3600 / 24 / 365);
//
//
////        0,10000 = 20000,115,2847 = 83886553887
////        999998,10000 = 5009994990000,863,21 = 2566697952830943253
////        999999,10000 = 5010000000000,7,1733 = 2566718966290478789
//
//
//        Set<Long> nos = Sets.newHashSet();
//
//        long step = 10000;
//        long initi = 10000;
//
//
//        Map<Integer, String> mm = Maps.newTreeMap();
//
//
//        for (long i = 0; i < 10000000L; i++) {
//            long rd = RANDOM.nextInt(1024);
//            long td = RANDOM.nextInt(4096);
//
////            if (i % 2000 == 0) {
////                initi += 10000;
////            }
//            long uu = (initi * i) + initi;
//
//            long idd = uu << 22 | rd << 12 | td;
//            nos.add(idd);
//            if (i == 0 || i == 1000000L - 1 || i == 1000000L - 2) {
//                System.out.println(i + "," + initi + " = " + uu + "," + td + "," + rd + " = " + idd);
//            }
//
//            Integer leg = String.valueOf(idd).length();
//            if (!mm.containsKey(leg)) {
//                mm.put(leg, i + " + " + initi + " -- " + uu + "," + td + "," + rd + " -- " + idd);
//            }
//
//        }
//
//        System.out.println(mm);
//
//        System.out.println(nos.size());
//
//        System.out.println(4095 * 6);
//        System.out.println(System.currentTimeMillis());
//        DateTime ddd = new DateTime();
//
//        System.out.println(ddd.toDate().getTime());
//        System.out.println(ddd.toString("yyyy-MM-dd HH:mm:ss.SSS"));
//        System.out.println(System.currentTimeMillis() - 1288834974657L);
//        System.out.println((System.currentTimeMillis() - 1288834974657L) << 22);
//        System.out.println(263637352634L / 1000 / 60 / 60 / 24 / 365);
//        System.out.println(1970L * 1000 * 60 * 60 * 24 * 365);
//
//        System.out.println(Long.MAX_VALUE - 1288834974657L);
//
//        System.out.println(Long.MAX_VALUE - System.currentTimeMillis());
//
//
//        System.out.println(2199023255551L - System.currentTimeMillis());
//        System.out.println(System.currentTimeMillis() - 1099511627776L);
//        System.out.println(2199023255551L - 1099511627776L);
//        //已知41位最大数位2199023255551L 最小数为1099511627776L  当前时间为1552472223935 要多少年才能到2199023255551？
//        System.out.println("需要年:" + (2199023255551L - System.currentTimeMillis()) / 1000 / 60 / 60 / 24 / 365);
//
//        System.out.println("需要年:" + (2199023255551L - System.currentTimeMillis() + 1288834974657L) / 1000 / 60 / 60 / 24 / 365);
//
////        646551369952
//
//        DateTime df = new DateTime(2019, 3, 13, 15, 20, 15);
//        System.out.println(df.toDate().getTime());
//
//        System.out.println(new Date().getTime());
//
//        df = new DateTime(2019, 2, 13, 15, 20, 15);
//        System.out.println(df.toDate().getTime());
//
//        DateTime da = new DateTime(new Date(1552461028862L));
//
//        System.out.println(da.toDate().getTime());
//        System.out.println(da.toString("yyyy-MM-hh HH:mm:ss.SSS"));
//
//        StopWatch watch = new StopWatch();
//        watch.start();
//
//        Test test = new Test();
//        Set<Long> ids = Sets.newHashSet();
//        for (int i = 0; i < 1000000; i++) {
//            long id = test.get("1111").getId();
//            if (ids.contains(id)) {
//                System.out.println(id);
//            }
//
//            ids.add(id);
//        }
//        watch.stop();
//
//        System.out.println(watch.getTotalTimeMillis());
//        System.out.println(ids.size());
//    }
//
//    public synchronized Result get(String key) {
//        long timestamp = this.timeGen();
//        long id;
//
//
//        if (timestamp < this.lastTimestamp) {
//            id = this.lastTimestamp - timestamp;
//            if (id > 5L) {
//                return new Result(-3L, Status.EXCEPTION);
//            }
//
//            try {
//                this.wait(id << 1);
//                timestamp = this.timeGen();
//                if (timestamp < this.lastTimestamp) {
//                    return new Result(-1L, Status.EXCEPTION);
//                }
//            } catch (InterruptedException var7) {
//                System.err.println("wait interrupted");
//                return new Result(-2L, Status.EXCEPTION);
//            }
//        }
//
//        if (this.lastTimestamp == timestamp) {
//            this.sequence = this.sequence + 1L & 4095L;
//            if (this.sequence == 0L) {
//                this.sequence = (long) RANDOM.nextInt(100);
//                timestamp = this.tilNextMillis(this.lastTimestamp);
//            }
//        } else {
//            this.sequence = (long) RANDOM.nextInt(100);
//        }
//
//        this.lastTimestamp = timestamp;
//        id = timestamp - 1288834974657L << 22 | this.workerId << 12 | this.sequence;
//        return new Result(id, Status.SUCCESS);
//    }
//
//    protected long tilNextMillis(long lastTimestamp) {
//        long timestamp;
//        for (timestamp = this.timeGen(); timestamp <= lastTimestamp; timestamp = this.timeGen()) {
//            ;
//        }
//
//        return timestamp;
//    }
//
//    protected long timeGen() {
//        return System.currentTimeMillis();
//    }
//
//    public long getWorkerId() {
//        return this.workerId;
//    }
//}
